////////////////////////////////////////////////////////////////////////////////

#ifndef _COMMONTYPES_H_
#define _COMMONTYPES_H_

////////////////////////////////////////////////////////////////////////////////

#include <utility>
#include <vector>
#include <map>
#include <cassert>

////////////////////////////////////////////////////////////////////////////////


/** [Utility type]: 2-dimensional point type */
struct Point
{
    Point( float _x = 0, float _y = 0 ) : x(_x), y(_y) {}

    bool operator==( const Point& _pt ) const
    {
        return _pt.x == x && _pt.y == y;
    }

    Point operator+( const Point& _pt ) const
    {
        Point pt;
        pt.x = x + _pt.x;
        pt.y = y + _pt.y;
        return pt;
    }

    float x;
    float y;
};


/** [Utility type]: Vector of integers */
typedef std::vector<int> IntVec;


/** Accesses map element */
template <typename _Key, typename _Value>
_Value& GetMappedValue( std::map<_Key, _Value>& _map, const _Key& _key )
{
    std::map<_Key, _Value>::iterator it = _map.find(_key);
    assert( it != _map.end() );
    return it->second;
}


/** Checks if collection contains element */
template <typename _Coll, typename _Key>
bool ContainsKey( const _Coll& _coll, const _Key& _key )
{
    _Coll::const_iterator it = _coll.find(_key);
    return it != _coll.end();
}


////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////
